package com.shujia.scala

import java.util

object Demo15List {
  def main(args: Array[String]): Unit = {

    /**
      * 集合分类
      *
      * 1、list  不可变，有序，不唯一
      * 2、Set  不可便，无序，唯一
      * 3、map  key-value
      * 4、tuple : 元组，
      *
      */


    val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 123, 123, 123, 141, 2312, 412, 312)

    /**
      * 集合中常用方法
      *
      */
    println(list.max)
    println(list.min)
    println(list.sum)
    println(list.head) //第一个元素
    println(list.last) //最后一个元素
    println(list.tail) //不包含第一个元素的所有元素
    println(list.take(2)) //获取前面n个元素
    println(list.length)
    println(list.size)
    println(list.isEmpty)
    println(list.nonEmpty)
    println(list.reverse) // 反转集合，返回一个新的集合

    //通过一个分隔符将集合中的元素拼接成一个字符串
    //功能和split 相反
    println(list.mkString("|"))

    /**
      * 时间复杂度
      * 代码做某一个操作需要循环的次数
      *
      * O(n)
      */

    println(list.contains(3))


    println(list.distinct) //取出重复数据，返回一个新的集合

    //通过下标取数
    println(list(2))

    /**
      * 对集合中每一个元素进行加一处理
      *
      */


    val list2: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
    val arratList = new util.ArrayList[Int]()

    for (elem <- list2) {
      val i = elem + 1
      arratList.add(i)
    }

    println(arratList)

    /**
      * map 函数， 将集合中的元素一个一个传递给后面的函数，追后返回一个新的集合
      * foreach :将集合中的元素一个一个传递给后面的函数  最后没有返回值
      */


    val list3: List[String] = list2.map((i: Int) => i.toString + "java")
    println(list3)


    list2.foreach((i: Int) => println(i))


    val aaaaa: List[Int] = list2.map(i => i % 2)
    println(aaaaa)

    //当函数的变量只使用一次的时候可以通过_ 代替
    val ints2: List[Int] = list2.map(_ % 2)


    val list5: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)


    /**
      * filter : 对集合中的数据进行过滤，将集合中的元素一个一个传递给后面的函数，如果后面函数返回true,保留这个元素
      * 如果后面函数返回false,g过滤这个元素
      *
      */

    //取出奇数
    val list7: List[Int] = list5.filter((i: Int) => i % 2 == 1)

    println(list7)


    val strs: List[String] = List("java,spark,hadoop,spark", "spark,scala,hive", "java,spark,java")

    //将集合中每一行所有单词拆分出来

    val words = new util.ArrayList[String]()

    for (line <- strs) {
      val spliys: Array[String] = line.split(",")
      for (word <- spliys) {
        words.add(word)
      }
    }

    println(words)

    println("=" * 100)

    /**
      *
      * flatMap: 将集合中的元素一个一个传递给后面的函数，函数的返回值必须是一个集合,  在会将集合中的元素一个一个拆分出来
      * 组成一个新的集合
      *
      * flatmap  ->  先进行一次map  在进行压扁
      *
      *
      *
      * 源集合中一行在新的集合中变成了多行
      *
      *
      * map是一对一的关系
      *
      */


    val wordss: List[String] = strs.flatMap((line: String) => line.split(","))

    println(wordss)


    /**
      * 排序
      *
      * sortBy ： 指定一个列排序, 默认是升序   返回一个新的集合
      * sortWith : 指定一个排序的规则    返回一个新的集合
      *
      *
      */


    val list4: List[Int] = List(1, 2, 4, 2, 3, 5, 6, 4, 4, 2, 2, 34, 23, 523, 4323, 5)


    val sortList: List[Int] = list4.sortBy((i: Int) => -i)

    println(sortList)

    println("=" * 100)


    val sortList2: List[Int] = list4.sortWith((i, j) => i > j)

    println(sortList2)


  }

}
